package org.jash.user.login

import androidx.lifecycle.viewModelScope
import com.example.common.mvi.BaseViewModel
import com.example.common.mvi.NetworkResult
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch

/**
 * 登录功能的ViewModel类
 * 负责处理登录相关的业务逻辑，继承自BaseViewModel
 * @param repository 登录数据仓库，用于执行登录操作
 */
class LoginViewModel(private val repository: LoginRepository) : BaseViewModel<LoginIntent, LoginViewState, LoginResult>() {
    /**
     * 初始化视图状态
     * @return 初始的LoginViewState对象
     */
    override fun initialState(): LoginViewState = LoginViewState()

    /**
     * 处理用户意图(Intent)
     * 根据不同的意图执行相应的操作
     * @param intent 用户意图对象
     */
    override suspend fun handleIntent(intent: LoginIntent) {
        // 根据意图类型进行相应处理
        when (intent) {
            // 如果是登录意图，则执行登录操作
            is LoginIntent.Login -> login(intent.username, intent.password)
        }
    }

    /**
     * 执行登录操作
     * 通过repository调用登录接口，并根据结果更新视图状态
     * @param username 用户名
     * @param password 密码
     */
    private suspend fun login(username: String, password: String) {
        // 更新状态为正在加载，清除错误信息，设置成功状态为false
        updateState(currentState().copy(isLoading = true, error = null, isSuccess = false))
        // 调用repository的登录方法并收集结果
        repository.login(username, password).collect { result ->
            // 根据网络请求结果进行相应处理
            when (result) {
                // 网络请求加载中状态
                is NetworkResult.Loading -> {
                    updateState(currentState().copy(isLoading = true, error = null))
                    // 可选：sendEvent(LoginResult.Loading)
                }
                // 网络请求成功状态
                is NetworkResult.Success -> {
                    updateState(currentState().copy(isLoading = false, isSuccess = true, error = null))
                    // 可选：sendEvent(LoginResult.Success)
                }
                // 网络请求错误状态
                is NetworkResult.Error -> {
                    updateState(currentState().copy(isLoading = false, isSuccess = false, error = result.exception.message))
                    // 可选：sendEvent(LoginResult.Error(result.exception.message))
                }
            }
        }
    }
}
